﻿namespace EFS.Common.Functions
{
	public static class Nullable<T> where T : struct
	{
		/// GetSafe
		public static T GetSafe(T? value, System.String name)
		{
			// check
			EFS.Common.Verify.Condition(value.HasValue, name);
			
			// ok
			return value.Value;
		}

		/// GetSafe
		public static T GetSafe(T? value, T @default)
		{
			if (value.HasValue)
			{
				return value.Value;
			}

			// def
			return @default;
		}

		/// EqualsSafe
		public static System.Boolean EqualsSafe(T? value, T compareTo)
		{
			if (!value.HasValue)
			{
				return false;
			}

			// def
			return value.Value.Equals(compareTo);
		}

		/// EqualsSafe
		public static System.Boolean EqualsSafe(T? value, T? compareTo)
		{
			// no values
			if (!value.HasValue && !compareTo.HasValue)
			{
				return true;
			}

			// have values
			if (value.HasValue && !compareTo.HasValue ||
				!value.HasValue && compareTo.HasValue ||
				!value.Value.Equals(compareTo.Value))
			{
				return false;
			}

			// ok
			return true;
		}

		/// ToString
		public static System.String ToString(T? value, System.String formatString = null)
		{	
			if (!value.HasValue)
			{
				return null;
			}

			// ok
			return EFS.Common.Formats.ToString(value.Value, formatString);
		}
	}

}